package utils;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Random;

public class NumberUtil implements Serializable {

	private static final long serialVersionUID = 1L;

	private static final int SCALE = 2;

	/**
	 * * 格式化 默认两位 并返回string*
	 */
	public static String transfer(Object v1) {
		return transfer(v1, SCALE);
	}

	/**
	 * * 格式化为指定位数 并返回string *
	 */
	public static String transfer(Object v1, int scale) {
		BigDecimal res = new BigDecimal(v1.toString()).setScale(scale, BigDecimal.ROUND_HALF_UP);
		return res.toString();
	}

	/**
	 * * 格式化 默认两位 *
	 */
	public static Double scale(Object v1) {
		return scale(v1, SCALE);
	}

	/**
	 * * 格式化为指定位数 *
	 */
	public static Double scale(Object v1, int scale) {
		BigDecimal res = new BigDecimal(v1.toString()).setScale(scale, BigDecimal.ROUND_HALF_UP);
		return new Double(res.doubleValue());
	}

	/**
	 * * 两个Double数相加 默认保留两位*
	 */
	public static Double add(Double v1, Double v2) {
		return add(v1, v2, SCALE);
	}

	/**
	 * * 两个Double数相加 并保留scale位小数*
	 */
	public static Double add(Double v1, Double v2, int scale) {
		BigDecimal res = new BigDecimal(v1.toString()).add(new BigDecimal(v2.toString())).setScale(scale, BigDecimal.ROUND_HALF_UP);
		return new Double(res.doubleValue());
	}

	/**
	 * * 两个Double数相减 默认保留两位*
	 */
	public static Double sub(Double v1, Double v2) {
		return sub(v1, v2, SCALE);
	}

	/**
	 * * 两个Double数相减 并保留scale位小数*
	 */
	public static Double sub(Double v1, Double v2, int scale) {
		BigDecimal res = new BigDecimal(v1.toString()).subtract(new BigDecimal(v2.toString())).setScale(scale, BigDecimal.ROUND_HALF_UP);
		return new Double(res.doubleValue());
	}

	/**
	 * * 两个Double数相乘 默认保留两位*
	 */
	public static Double mul(Double v1, Double v2) {
		return mul(v1, v2, SCALE);
	}

	/**
	 * * 两个Double数相乘 并保留scale位小数 *
	 */
	public static Double mul(Double v1, Double v2, int scale) {
		BigDecimal res = new BigDecimal(v1.toString()).multiply(new BigDecimal(v2.toString())).setScale(scale, BigDecimal.ROUND_HALF_UP);
		return new Double(res.doubleValue());
	}

	/**
	 * * 两个Double数相除 默认保留两位*
	 */
	public static Double div(Double v1, Double v2) {
		return div(v1, v2, SCALE);
	}

	/**
	 * * 两个Double数相除，并保留scale位小数 *
	 */
	public static Double div(Double v1, Double v2, int scale) {
		BigDecimal res = new BigDecimal(v1.toString()).divide(new BigDecimal(v2.toString()), scale, BigDecimal.ROUND_HALF_UP);
		return new Double(res.doubleValue());
	}

	/**
	 * * 范围内随机数 指定保留位数
	 */
	// public static Double random(int min, int max) {
	// Random random = new Random();
	// Double res = add(new Double(random.nextInt(max) % (max - min + 1) + min),
	// new Double(random.nextDouble()), SCALE);
	// return res;
	//
	// }

	public static Long random(Long min, Long max) {
		BigInteger res=random(new BigInteger(min.toString()), new BigInteger(max.toString()));
		return res.longValue();
	}

	// 获得随机数,包含min和max
	public static BigInteger random(BigInteger min, BigInteger max) {
		Random random = new Random();
		BigInteger seed = new BigInteger(128, random);
		return seed.mod(max.subtract(min).add(new BigInteger("1"))).add(min);
	}

	/**
	 * * 转成百分制 默认两位
	 */
	public static Double percent(Double v1) {
		return div(v1, new Double(100));
	}

	/**
	 * * 转成百分制 指定小数位数
	 */
	public static Double percent(Double v1, int scale) {
		return div(v1, new Double(100), scale);
	}

	/**
	 * * 百分制倒转 默认两位
	 */
	public static Double unpercent(Double v1) {
		return mul(v1, new Double(100));
	}

	/**
	 * * 百分制倒转 指定小数位数
	 */
	public static Double unpercent(Double v1, int scale) {
		return mul(v1, new Double(100), scale);
	}

	public static void main(String[] args) throws Exception {

	

	}

}